﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//文件顺序读写
/*************
* scanf/printf 针对所有标准输入流/标准输出流的 格式化 输入/输出函数
**************/
//写文件 fputs文本行输出函数
//int main()
//{
//	//1、打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、写文件
//	fputs("holle world\n",pf);
//	fputs("dechixiaozi!!!\n",pf);
//	//3、关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//读文件 //fgets文本行输入函数 字符串
//int main()
//{
//	//1、打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、读文件
//	 char arr[20] = "xxxxxxxxxxxxx";
//  //从文件指针 pf 中读 5个字节 存到arr数组里面
//	 fgets(arr,5,pf);//fgets 读文件 将文件中你想读出来的字符拷贝到一个数组里面
//	 //也么读到换行就会停  要么读到文件结束 要么读到你想要的字符位置-1的字符
//	 //把该读的字符读完之后会补个\0
//	 printf("%s\n", arr);
//
//	//3、关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
/*****************************************************************
//fscanf/fprintf针对书友输入流/输出输出流的 格式化 输入/输出函数
******************************************************************/
//写文件//fprintf格式化输出函数
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
////
//int main()
//{
//	//struct S s = {  "dechixiaozi",15,88.0f };
//	struct S s = { .name="dechixiaozi",.age=15,.score=88.0f };
//	//1、打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、写文件
//	fprintf(pf,"%s %d %.1f", s.name, s.age, s.score);
//	//printf("%s %d %f", name, age, score);
//
//	//3、关闭文件   
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

////读文件 //fscanf格式化输入函数
//struct S
//{
//	char name[30];
//	int age;
//	float score;
//};
////
//int main()
//{
//	struct S s = { "dechixiaozi",15,88.0f };
//	//struct S s = { .name="dechixiaozi",.age=15,.score=88.0f };
//	//1、打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、读文件
//	//从文件读取信息 存放到结构体成员S中
//	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
//	//打印在屏幕上
//	printf("%s %d %.1f\n", s.name, s.age, s.score);
//	//3、关闭文件   
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


/*******************************
sprintf/sscanf 将格式化的数据转换成字符串     从字符串中提取格式化的数据
********************************/
//struct S  
//{
//	char name[30];
//	int age;
//	float score;
//};
////
//int main()
//{
//	char arr[100] = { 0 };
//	struct S s = { "dechixiaozi",15,88.0f };
//	//struct S s = { .name="dechixiaozi",.age=15,.score=88.0f };
//	//临时结构体变量来存放ssanf函数取出来的字符串
//	struct S tmp = { 0 };
//	
//	//将s中的各个数据转换成字符串，存放在arr中
//	sprintf(arr, "%s %d %.1f", s.name, s.age, s.score);
//	//printf("%s", arr);//因为数据已经变成字符串了，打印出来用字符串占位符就行
//	
//	//从arr字符串中提取格式化的数据，存在tmp里面
//	sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));//把arr字符串的数组逐个提取出来
//	printf("%s %d %.1f", tmp.name, tmp.age, tmp.score);//因为是提取出了每一个数据 每一个都需要一个占位符
//	//打印在屏幕上
//	return 0;
//}


// fwrite 写二进制文件
//struct S  
//{
//	char name[30];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "dechixiaozi",15,88.0f };
//	//以二进制的形式写到文件中
//
//	//1.打开文件
//	FILE* pf =fopen("test.txt", "wb");//wb 以二进制文件写
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、写文件
//	fwrite(&s, sizeof(struct S),1,pf);//将ptr中count个，大小为size个字节的数据写到文件中
//	//3、关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

// fread 读二进制文件
//struct S
//{
//	char name[30];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { 0 };
//	//读取二进制的信息写到文件中
//
//	//1.打开文件
//	FILE* pf = fopen("test.txt", "rb");//rb 以二进制文件读
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、读文件 按顺序
//	fread(&s, sizeof(struct S), 1, pf);//从文件中读取count个大小为size个字节的数据，存放在空间中
//	printf("%s %d %.1f", s.name, s.age, s.score);
//	//3、关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//文件随机读写
//fseek
//根据⽂件指针的位置和偏移量来定位⽂件指针（⽂件内容的光标）
//ftell
//返回⽂件指针相对于起始位置的偏移量
//rewind
//让⽂件指针的位置回到⽂件的起始
//int main()
//{
//	//1.打开文件
//	FILE* pf = fopen("test.txt", "r");//
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//2、读文件 按顺序
//	int ch = 0;//fgetc返回值是int类型 接收的也得是int 有可能会返回一个EOF
//	ch = fgetc(pf);//a
//	printf("%c\n", ch);//每次读一次 文件指针会往后走
//	ch = fgetc(pf);//b
//	printf("%c\n", ch);
//
//	//定位文件指针
//
//	//fseek(pf, 4, SEEK_SET);//移动文件光标  起始位置
//	//fseek(pf, 2, SEEK_CUR);//当前位置开始往后偏移多少
//	fseek(pf, -2, SEEK_END);//结束位置开始往前偏移多少   根据⽂件指针的位置和偏移量来定位⽂件指针（⽂件内容的光标）
//	ch = fgetc(pf);//b
//	printf("%c\n", ch);
//
//	//输出文件指针相较于文件的起始位置的偏移量
//	printf("%d\n", ftell(pf));//返回⽂件指针相对于起始位置的偏移量
//
//	rewind(pf);
//	ch = fgetc(pf);//a
//	printf("%c\n", ch); ///让⽂件指针的位置回到⽂件的起始
//
//
//	//3、关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}



//拷贝文件
//把test.1  拷到test.2
//int main()
//{
//	//打开文件
//	FILE* R = fopen("test1.txt", "r");//读被拷贝的文件
//	if (R == NULL)
//	{
//		perror("fopen\n");
//		return 1;
//	}
//	FILE* W = fopen("test2.txt", "w");//打开拷贝的目标文件
//	if (W == NULL)
//	{
//		perror("fopen\n");
//		fclose(R);
//		return 1;
//	}
//	//读写文件
//	int ch = 0;
//	while ((ch = fgetc(R)) != EOF)//从R里面每个字符循环去读存到 ch 里面
//	{
//		fputc(ch, W);//从ch里面循环去写进W里面
//	}
//	fclose(R);
//	R = NULL;
//
//	fclose(W);
//	W = NULL;
//	return 0;
//}

int main()
{
	//1.打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//2、读文件 按顺序
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)//从R里面每个字符循环去读存到 ch 里面
	{
		printf("%c ", ch);//从ch里面循环去写进W里面 
	}
	int ret = feof(pf);//feof为1 代表正常去读文件，读到文件末尾了 
	printf("\n%d\n", ret);

	ret = ferror(pf);//ferror为0 文件结束有没有遇到错误
	printf("%d\n", ret);


	fclose(pf);
	pf = NULL;
	return 0;
}
